package services.impl;

import java.util.List;
import java.util.Vector;

import javax.ejb.EJB;
import javax.ejb.Stateless;

import services.ExchangeFormatService;
import services.OrdenCompraService;
import services.ProveedorService;
import services.RodamientoService;
import JMS.JMSService;
import dao.OrdenCompraDAO;
import entities.ItemOrdenCompra;
import entities.ItemVenta;
import entities.OrdenCompra;
import entities.Proveedor;
import entities.RodamientoStock;
import entities.xml.OrdenCompraXML;
import finals.Finals;

@Stateless
public class OrdenCompraServiceBean implements OrdenCompraService{
	
	@EJB
	private OrdenCompraDAO ordenCompraDAO;
	@EJB
	private ProveedorService proveedorService;
	@EJB 
	private RodamientoService rodamientoService;
	@EJB
	private ExchangeFormatService exchangeFormatService;
	@EJB
	private JMSService jmsService;
	
	@Override
	public void generarYEnviarOC(List<ItemVenta> itemsVenta) {
		if(!itemsVenta.isEmpty()){
			List<OrdenCompra> ordenes = this.generarOC(itemsVenta);
			this.enviarOCAProveedores(ordenes);
		}
		
	}
	
	@Override
	public List<OrdenCompra> generarOC(List<ItemVenta> itemsVenta) {
		List<OrdenCompra> ordenes = new Vector<OrdenCompra>();
		for (ItemVenta item : itemsVenta) {
			this.disminuirStockGenerandoOC(ordenes, item);
		}		
		if (!ordenes.isEmpty()){
			this.persistAll(ordenes);
		}
		return ordenes;
	}
	
	public void enviarOCAProveedores(List<OrdenCompra> ordenes){
		for(OrdenCompra orden : ordenes){
			String ordenXML = exchangeFormatService.toEF(orden, new OrdenCompraXML());
			//String razonSocialProveedor = orden.getProveedor().getRazonSocial();
			jmsService.enviarJMS(ordenXML, Finals.COLAS.get("proveedorEJBOrdenesCompra"), Finals.IPS.get("proveedorEJBOrdenesCompra"));
		}
	}
	
	/**
	 * Con la cantidad de itemVenta generara una OC. Si ya hay una OC con el mismo proveedor
	 * en el array ordenes que se le pasa como parametro, no se crea otra OC por separado, sino que
	 * se busca esa OC en el array y se le agrega el item. De lo contrario, se crea una nueva OC y
	 * se agrega al array ordenes.
	 */
	private void disminuirStockGenerandoOC(List<OrdenCompra> ordenes, ItemVenta itemVenta){
		RodamientoStock rodamientoStock = (RodamientoStock) rodamientoService.findRodamientoStock(itemVenta.getRodamiento());
		ItemOrdenCompra itemOC = new ItemOrdenCompra(rodamientoStock, itemVenta.getCantidad(), itemVenta.getListaPreciosId());
		Proveedor proveedor = proveedorService.findByListaPreciosID(itemVenta.getListaPreciosId());
		proveedor = proveedorService.findByRazonSocial(proveedor.getRazonSocial());
		OrdenCompra oc = new OrdenCompra(proveedor);
		int ocIndice = this.verificarSiYaHayOCEnProcesoParaProveedor(ordenes, oc);
		if (ocIndice >=0){
			oc =ordenes.get(ocIndice);
		}else{
			oc.setItems(new Vector<ItemOrdenCompra>());
			ordenes.add(oc);
		}
		oc.getItems().add(itemOC);
	}
	
	/**
	 * Se hace una OC por cada proveedor distinto al que se necesite pedir.
	 * Este metodo verifica si en el loop en el que esta metido ya cree una OC con el proveedor
	 * que esta seteado en el parametro oc.
	 */
	private int verificarSiYaHayOCEnProcesoParaProveedor(List<OrdenCompra> ordenes, OrdenCompra oc){
		for(int i = 0; i < ordenes.size(); i++){
			if(ordenes.get(i).getProveedor().getRazonSocial().equals(oc.getProveedor().getRazonSocial())){
				return i;
			}
		}
		return -1;
	}
	
	@Override
	public void delete(Object id) {
		ordenCompraDAO.delete(id);
	}

	@Override
	public List<OrdenCompra> findAll() {
		return ordenCompraDAO.findAll();
	}

	@Override
	public OrdenCompra findByID(Object id) {
		return ordenCompraDAO.findByID(id);
	}

	@Override
	public void persist(OrdenCompra entity) {
		ordenCompraDAO.persist(entity);
	}

	@Override
	public OrdenCompra merge(OrdenCompra entity) {
		return ordenCompraDAO.merge(entity);
	}

	@Override
	public void persistAll(List<OrdenCompra> ordenes) {
		for(OrdenCompra ordenCompra : ordenes){
			ordenCompraDAO.persist(ordenCompra);
		}
	}
	
}
